﻿//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Xml;
//using System.Xml.XPath;
//using System.Xml.Xsl;
//using System.Diagnostics;

//namespace GenericLibrary.Xml.XPath {

//    public abstract class XPathNodeIterator<T> : XPathNodeIterator where T : XPathNodeIterator<T>, new() {

//        private int _currentPosition;
//        private IEnumerator<XPathNavigator> _enumerator;

//        protected abstract IEnumerable<XPathNavigator> NodeSet { get; }
//        protected abstract void CopyFrom( T source );

//        protected XPathNodeIterator() {
//            this._enumerator = null;
//            this._currentPosition = 0;
//        }

//        public override XPathNodeIterator Clone() {
//            try {
//                T clone = new T();
//                clone.CopyFrom( this as T );
//                while( clone.MoveNext() && clone._currentPosition < this._currentPosition )
//                    ;
//                if( clone._currentPosition == this._currentPosition && clone.Current == this.Current ) {
//                    return clone;
//                }
//                throw new Exception();
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override XPathNavigator Current {
//            get {
//                try {
//                    return this._enumerator.Current;
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override int CurrentPosition {
//            get {
//                return this._currentPosition;
//            }
//        }

//        public override bool MoveNext() {
//            try {
//                if( this._enumerator == null ) {
//                    this._enumerator = this.NodeSet.GetEnumerator();
//                }
//                if( this._enumerator.MoveNext() ) {
//                    this._currentPosition++;
//                    return true;
//                }
//                return false;
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }
//    }
//}
